<?php
/**
 * 配列に関する操作.
 *
 * @date 2008/08/08
 * @author nagai
 * @version $Id: lib_array_util.php 4 2009-11-24 06:02:55Z tzr250rsp $
 */
class lib_array_util{


  /**
   * array merge.
   * @param $array1
   * @param $array2
   * @return array
   */
  static public function arrayMerge($array1 ,$array2){
    return array_merge($array1, $array2);
  }


  /**
   * 空の配列を削除します.
   *@n 全てか空の場合は nullを返します.
   *@n 多次元配列用です array(array(),array(),array())
   * @param array
   * @return array | null
   */
  static public function arrayNoEmptyKill($array){
    if (!is_array($array))return array();
    $resArray = array();//初期化
    foreach ($array as $key => $val){
      if(0 !==  count ( array_diff( (array)$val, array( "" ) ) )){
        $resArray[] = $val;
      }
    }

    if ( 0 == count( $resArray ) ){
      return null;
    }else{
      return $resArray;
    }
  }


  /**
   * 配列の中にarrayStrposがあるか.
   * @code
   * $array = array('aaaaaaaaa','aiueokakikukeko','sasisuseso',array('momomo.dat','mumumu'));
   * $res = lib_arrayUtl::arrayStrpos($array,'momomo.dat');
   * @endcode
   * @param array $array
   * @param mixed $needle
   * @return bool
   */
  public static function arrayStrpos($array,$needle){
    if(is_array($array)){
      foreach($array as $k => $v){
        //or ビット演算
        $res |= self::arrayStrpos($v,$needle);
      }
    }else{
      $response = strpos($array,$needle);
      if (false !== $response){
        return true;
      }
    }
    return (bool)$res;
  }


  /**
   * 配列を比較します
   * array1にあって、array2に無いもの。返さない
   * array1にあって、array2にあるもの。array2
   * array1になくて、array2にあるもの。返さない
   * array1になくて、array2に無いもの。返さない
   *
   * @param array $array1
   * @param array $array2
   * @return array
   */
  public static function intersectKey($array1,$array2){
    return array_intersect_key($array1,$array2);
  }


  /**
   * @example lib_arrayUtl::intersectKeyMask
   * 配列のkey同士を比較 array2のvalを array1のkeyとしてみます.
   *
   * @code
   * $array1 = array('name'=>'なまえ'     , 'id'=>'123'   , 'flag'=>1   );//requestデータ
   * $array2 = array('USERNAME'=>'name'  , 'USERID'=>'id'    );//マスクするmap的なもの
   * $response = lib_arrayUtl::intersectKeyMask($array1,$array2);
   * print_r($response);
   * //response   array('USERNAME'=>'なまえ' , 'USERID'=>'123')
   * @endcode
   */
  /**
   * 配列のkey同士を比較 array2のvalを array1のkeyとしてみます.
   * array2のvalue = array2のkey  array1のkey=>array1のvalue
   * @param array $array1
   * @param array $array2
   * @return array
   */
  public static function intersectKeyMask($array1,$array2){
    $req = array();//初期化
    //両方とも配列でない場合は、空arrayを返す
    if ( false === is_array($array1) or false === is_array($array2) ){
      return $req;
    }
    foreach($array2 as $key => $val){
      if ( isset($array1[$val]) ){  $req[$key] = $array1[$val]; }
    }
    return $req;
  }


  /**
   * 配列を比較。 array2のvalueを array1のキーとしてみる.
   * array2のvalue == array1のkey   array('array2のkey'=>array1のvalue)
   * @param array $array1
   * @param array $array2
   * @return array
   */
  public static function intersectValKeyMask($array1,$array2){
    $req = array();//初期化

    //両方とも配列でない場合は、空arrayを返す
    if ( false === is_array($array1) or false === is_array($array2) ){
      return $req;
    }

    foreach($array2 as $key => $val){
      if ( isset($array1[$val]) ){  $req[$key] = $array1[$val]; }
    }
    return $req;
  }


  /**
   * 配列を比較。 array2のvalueを array1のキーとしてみる.
   * array2のvalue == array1のkey   array('array2のval'=>array1のvalue)
   * @param array $array1
   * @param array $array2
   * @return array
   */
  public static function intersectValKeyMaskReturnKey($array1,$array2){
    $req = array();//初期化

    //両方とも配列でない場合は、空arrayを返す
    if ( false === is_array($array1) or false === is_array($array2) ){
      return $req;
    }

    foreach($array2 as $key => $val){
      if ( isset($array1[$val]) ){  $req[$val] = $array1[$val]; }
    }
    return $req;
  }


  /**
   *
   * @example lib_arrayUtl::rows_search
   * rows内をWHERE句っぽく検索します.
   * @code
   *
   * //ダミーデータ
   * $data = array (
   *  array ( "name" => "bill", "age" => 40 ),
   *  array ( "name" => "john", "age" => 30 ),
   *  array ( "name" => "jack", "age" => 50 ),
   *  array ( "name" => "john", "age" => 25 )
   * );
   * //ageが30以上
   * $res =  lib_arrayUtl::rows_search($data , "age>=30" );
   * //nameがjohn
   * $res =  lib_arrayUtl::rows_search($data , "name=='john'"  );
   * //年齢が25を超える and 名前がjohn.
   * $res =  lib_arrayUtl::rows_search($data , "age>25 and name=='john'"  );
   *
   * @endcode
   */
  /**
   * rows内をWHERE句っぽく検索します.
   * @param $array
   * @param $expression
   * @return array
   */
  public static function rows_search( $array, $expression ) {
    $result = array();
    $expression = preg_replace ( "/([^\s]+?)(=|<|>|!)/", "\$a['$1']$2", $expression );
    foreach ( $array as $k => $a ) if ( eval ( "return $expression;" ) ) $result[$k] = $a;
    return $result;
  }

}
//end of class
?>